// 从本地存储获取token
export function getToken() {
  return localStorage.getItem('token') || sessionStorage.getItem('token');
};

// 删除本地存储的token
export function removeToken() {
  localStorage.removeItem('token');
  sessionStorage.removeItem('token');
};

// 保存token到本地存储
export function saveToken(token, remember = false) {
  removeToken();
  if (remember) {
    localStorage.setItem('token', token);
  } else {
    sessionStorage.setItem('token', token);
  }
};

// 从本地存储获取用户信息
export function getUser() {
  let user = localStorage.getItem('user') || sessionStorage.getItem('user');
  return user && JSON.parse(user);
};

// 删除本地存储的用户信息
export function removeUser() {
  localStorage.removeItem('user');
  sessionStorage.removeItem('user');
};

// 保存用户信息到本地存储
export function saveUser(user, remember = false) {
  removeUser();
  if (remember) {
    localStorage.setItem('user', JSON.stringify(user));
  } else {
    sessionStorage.setItem('user', JSON.stringify(user));
  }
};

// 退出登录
export function logout() {
  removeToken();
  removeUser();
  location.reload();
}

// 判断用户是否登录
export function isLogin() {
  return Boolean(getToken() && getUser());
}

// 从location.search中获取param
export function getParamFromSearch(search = location.search) {
  if (search === '' || search === '?') return {};
  return search.split('&').reduce((prev, cur, i) => {
    let [key, value] = cur.split('=');
    if (i == 0) key = key.slice(1); // 去掉?号
    prev[key] = value;
    return prev;
  }, {});
};

// 对象转查询参数字符串（不带问好的location.search）
export function getQueryStrFromParam(param = {}) {
  let keys = Object.keys(param);
  return keys.map(key => `${key}=${param[key]}`).join('&');
};

// 对象转类似location.search的符串
export function getSearchFromParam(param = {}) {
  let queryStr = getQueryStrFromParam(param);
  return queryStr ? '?' + queryStr : '';
};

// 根据location.search中的redirect实现自动跳转
export function autoRedirect() {
  let param = getParamFromSearch();
  let redirect = param.redirect;
  if (redirect) {
    delete param.redirect;
    let search = getSearchFromParam(param);
    location.replace(`/${redirect}.html${search}`);
  } else {
    location.replace(document.referrer);
  }
};

// 移除字符串中所有的空白字符
export function trimAll(str) {
  return str.replace(/\s+/g, '');
};

// 字符串转为手机号码格式
export function toPhoneNum(str) {
  return trimAll(str).replace(/(^\d{3}|\d{4})(?=\d)/g, '$1 ');
};

// 将输入框中的输入格式化为手机号码
export const fmtInputToPhoneNum = function () {
  let oldVal = '';
  return function (input) {
    var i = input.selectionStart;
    (i == 4 || i == 9) && (input.value[i - 1] != ' ') && i++;
    if (/^[\d ]*$/.test(input.value) && input.value.length <= 13) {
      oldVal = input.value = toPhoneNum(input.value);
    } else {
      input.value = oldVal;
    }
    input.selectionStart = input.selectionEnd = i;
  };
}();

// 验证手机号码是否合法
export function testPhoneNum(num) {
  return /^1\d{10}$/.test(num);
};

// 移除一个对象中的undefined
export function removeUndefined(obj) {
  Object.keys(obj).forEach(key => {
    if (obj[key] === undefined) delete obj[key];
  });
  return obj;
};

// 判断一个字符串中的所有字符是否都一样
export function isStringPure(str) {
  return Array.prototype.every.call(str, (v, i, arr) => !i || v == arr[i - 1]);
};

/**
 * 判断一个对象小于等于另一个对象
 * @param {object} obj1
 * @param {object} obj2
 * @returns {boolean} obj1中所有键值对都能在obj2中找到相同的键和值
 */
export function is_obj_lte(obj1, obj2) {
  return Object.keys(obj1).every(key => {
    let a = obj1[key];
    let b = obj2[key]; // true=>'1' false=>'0'
    switch (typeof b) {
      case 'boolean':
        b = +b + '';
        break;
      case 'number':
        b = b + '';
        break;
    }
    if (b === undefined || b === null) b = '';
    return a === b;
  });
};

/**
 * 设置分页器
 * @param {object} el jQuery对象、选择器、Dom对象
 * @param {number} currentPage 当前页
 * @param {number} totalPages 总页数
 * @param {object} options bootstrapPaginator插件的选项
 */
export function set_pagination(el, currentPage, totalPages, options) {
  let defOptions = {
    bootstrapMajorVersion: 3, // 搭配使用的bootstrap版本，如果bootstrap的版本是2.X的分页必须使用div元素。3.X分页的必须使用ul>li元素。注意与bootstrap版本对应上。
    // size: 'normal', // 设置控件的显示大小，允许的值：mini，small，normal，large。
    // alignment: 'center', // 设置控件的对齐方式，允许的值：left，center，right。适用于版本2。
    // itemContainerClass: (type, page, current) => page == current ? 'active' : '',
    currentPage: currentPage, // 设置当前页。
    // numberOfPages: 5, // 设置控件显示的页码数。即：类型为“page”的操作按钮数量。
    totalPages: totalPages, // 设置总页数
    pageUrl: (type, page, current) => {
      if (page == current) {
        return undefined;
      } else {
        let search = getSearchFromParam({ ...getParamFromSearch(), page });
        return 'resumes.html' + search;
      }
    },
    // shouldShowPage: (type, page, current) => true, // boolean/function
    // itemTexts: (type, page, current) => ({
    //   'first': '首页',
    //   'prev': '上一页',
    //   'page': page,
    //   'next': '下一页',
    //   'last': '尾页',
    // }[type]),
    tooltipTitles: () => undefined,
    // useBootstrapTooltip: false,
    // bootstrapTooltipOptions: { // bootstrap-tooltip插件选项
    //   animation: true,
    //   html: true,
    //   placement: 'top',
    //   selector: false,
    //   title: "",
    //   container: false,
    // },
    // onPageClicked: (event, originalEvent, type, page) => {
    //   console.log(event, originalEvent, type, page);
    // },
    // onPageChanged: (event, oldPage, newPage) => {
    //   console.log(event, oldPage, newPage);
    // },
  };
  options = { ...defOptions, ...options };

  let $el = $(el);
  $el.bootstrapPaginator(options);
  $el.after(
    `<ul class="pagination${{ small: ' pagination-sm', large: ' pagination-lg' }[options.size] || ''}">
      <li><span style="border-color: transparent;" id="totals">共 ${totalPages} 页</span></li>
    </ul>`
  );
};

/**
 * 获取某个日期距现在的年数
 * @param {string} dateStr 形如YYYY-mm-dd格式的日期字符串
 */
export function get_years_to_now(dateStr) {
  let date = new Date(dateStr);
  let date_y = date.getFullYear();
  let date_m = date.getMonth() + 1;
  let date_d = date.getDate();
  let date_years = date_y + date_m / 12 + date_d / 30 / 12;
  let now = new Date();
  let now_y = now.getFullYear();
  let now_m = now.getMonth() + 1;
  let now_d = now.getDate();
  let now_years = now_y + now_m / 12 + now_d / 30 / 12;
  return Math.floor(now_years - date_years);
};

/**
 * 根据给定的对象生成FormData对象
 * @param {object} obj 普通键值对js对象
 * @returns {object} 返回一个FormData对象
 */
export function make_formdata(obj) {
  let fd = new FormData()
  Object.keys(obj).forEach(key => fd.append(key, obj[key]))
  return fd
}
